#include <iostream>
#include <string>
#include <vector>
#include <sw/redis++/redis.h>
#include <chrono>
#include <thread>
using std::cin;
using std::cout;
using std::endl;
using std::iostream;
using std::string;
using std::vector;

using namespace sw::redis;

template <class T>
void print(T &arr)
{

    for (auto it : arr)
    {
        cout << it << endl;
    }
}

void test_get_set(Redis &redis)
{

    redis.flushall();

    auto ok1 = redis.set("key1", "111");

    auto val1 = redis.get("key1");
    if (val1.has_value())
        cout << val1.value() << endl;

    auto ok2 = redis.set("key2", "222");

    auto val2 = redis.get("key2");
    if (val2.has_value())
        cout << val2.value() << endl;

    auto val = redis.get("key3");
    if (val.has_value())
        cout << val.value() << endl;
}

void test_exist(Redis &redis)
{
    redis.flushall();

    auto ok1 = redis.set("key1", "111");
    auto ok2 = redis.set("key2", "222");
    auto ex1 = redis.exists("key3");
    cout << "key3  exist: " << ex1 << endl;
    auto ex2 = redis.exists({"key1", "key2", "key3"});
    cout << "key1 key2 key3 exist: " << ex2 << endl;
}

void test_del(Redis &redis)
{
    redis.flushall();

    auto ok1 = redis.set("key1", "111");
    auto ok2 = redis.set("key2", "222");
    long long d1 = redis.del("key1");
    long long d2 = redis.del("key2");
    auto ex1 = redis.exists("key3");
    cout << "key3  exist: " << ex1 << endl;
    auto ex2 = redis.exists({"key1", "key2", "key3"});
    cout << "key1 key2 key3 exist: " << ex2 << endl;
}

void test_keys(Redis &redis)
{
    redis.flushall();
    auto ok2 = redis.set("key2", "111");
    auto ok3 = redis.set("key3", "111");
    auto ok4 = redis.set("key4", "111");
    auto ok5 = redis.set("key5", "111");
    vector<string> v;
    auto bit = std::back_inserter(v);
    redis.keys("key*", bit);
    print(v);
    v.clear();
    redis.keys("*5", bit);
    print(v);
}

void test_expire_ttl(Redis &redis)
{
    redis.flushall();
    auto ok5 = redis.set("key5", "111");
    // redis.expire("key5",std::chrono::seconds(10));
    using namespace std::chrono_literals;
    redis.expire("key5", 10s);
    // 进行对进程休眠，方面服务端计时：
    std::this_thread::sleep_for(3s);
    auto t = redis.ttl("key5");
    cout << t << endl;
}

int main()

{
    Redis redis("tcp://127.0.0.1:6379");
    redis.command("select", 6);

    // test_get_set(redis);
    // test_exist(redis);

    // test_del(redis);

    // test_keys(redis);
    test_expire_ttl(redis);
}
